package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 刘远望
 * Date: 2025-05-23
 * Time: 22:02
 */
//给线程上锁 确保线程安全
public class Demo16 {

    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                //这里的括号可以是任何对象引用
                //synchronized关键字{}中的代码块就是要在机器语言中锁住执行的机器指令(将多个指令变成打包成一个)具有原子性
                synchronized (locker) {//进入代码块，相当于加锁
                    count++;//执行一些要保护的逻辑
                }//出了代码块，就相当于解锁
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                //两个线程针对同一个对象(locker)加锁才能产生互斥效果 线程安全得到保证
                synchronized (locker) {
                    count++;
                }
            }
        });
        /**
         * 如果t2是后获取锁的
         * t1就已经lock完成了
         * t2的lock就会阻塞t2线程的进行 等到t1执行完unlock之后 t2才会继续执行
         */
        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("count: " + count);

    }
}
